package com.stock.generator;


import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 代码生成器（MyBatis-Plus 3.5.14）
 *
 * 生成结果符合 stock-share 模块现有结构：
 * - 基础包：com.share.module.{moduleName}
 * - 分层：dao/entity/service/web
 * - Mapper 命名：%sDAO，XML：%sDAO.xml
 * - Service 仅生成实现类：%sService（无 Service 接口、无 ServiceImpl 文件）
 * - XML 输出目录：stock-share/src/main/resources/mapper/{moduleName按点分割的路径}
 * - Java 输出目录：stock-share/src/main/java
 */
public class CodeGenerator {

    // =================== 可按需修改的配置 ===================
    // 数据源（保持与 stock-share application-dev.yml 一致）
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/stock?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai";
    private static final String JDBC_USERNAME = "root";
    private static final String JDBC_PASSWORD = "123456";

    // 目标模块与表（moduleName 支持多级，如："sys.user" → 包路径 com.share.module.sys.user）
    private static final String MODULE_NAME = "business.stockprofit"; // 示例：sys.user / business.stock 等
    private static final List<String> TABLES = Arrays.asList(
            // 在此列出要生成的表名，例如："sys_user"
            "stock_profit"
    );

    // 包和作者
    private static final String BASE_PACKAGE = "com.share.module";
    private static final String AUTHOR = "lijy";

    // 输出目录（相对工程根路径）
    private static final String PROJECT_ROOT = System.getProperty("user.dir");
    private static final String SHARE_MODULE = PROJECT_ROOT + "/stock-share";
    private static final String OUTPUT_DIR_JAVA = SHARE_MODULE + "/src/main/java";
    private static final String OUTPUT_DIR_XML = SHARE_MODULE + "/src/main/resources/mapper/" + MODULE_NAME.replace('.', '/');

    // 表前缀（可按需调整，如统一去除 "sys_" 前缀映射为实体名）
    private static final String[] TABLE_PREFIX = new String[]{
            // "sys_"
    };

    public static void main(String[] args) {
        generate();
    }

    private static void generate() {
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                .globalConfig(builder -> builder
                        .author(AUTHOR)
//                        .enableSwagger()
                        .outputDir(OUTPUT_DIR_JAVA)
                )
                .dataSourceConfig(builder -> builder
                        .typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder -> builder
                        .parent(BASE_PACKAGE)
                        .moduleName(MODULE_NAME)
                        .entity("entity")
                        .mapper("dao")
                        .xml(null) // 通过 pathInfo 单独指定 XML 路径
                        .service("service")
                        .serviceImpl("service") // 不生成 Impl，这里仅占位
                        .controller("web")
                        .pathInfo(Collections.singletonMap(OutputFile.xml, OUTPUT_DIR_XML))
                )
                .strategyConfig(builder -> builder
                        .addInclude(TABLES)
                        .addTablePrefix(TABLE_PREFIX)
                        // Entity 策略
                        .entityBuilder()
                        .enableLombok()
                        .enableTableFieldAnnotation()
                        .enableChainModel()
                        // 如需将公共字段交由父类 BaseEntity 维护，可在此声明父类与公共列
                        .superClass("com.stock.mybatisplus.entity.BaseEntity")
                        .addSuperEntityColumns(
                                "id", "create_by", "create_date", "update_by", "update_date", "status", "company_code", "version"
                        )
                        .formatFileName("%s")
                        .build()
                        // Mapper/Xml 策略（DAO 命名）
                        .mapperBuilder()
                        .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class)
                        .superClass(com.baomidou.mybatisplus.core.mapper.BaseMapper.class)
                        .formatMapperFileName("%sDAO")
                        .formatXmlFileName("%sDAO")
                        .build()
                        // Service 仅生成类（无接口、无 Impl）
                        .serviceBuilder()
                        .formatServiceFileName("%sService")
                        .disableServiceImpl()
                        .build()
                        // Controller 放在 web 包，走 Rest 风格
                        .controllerBuilder()
                        .enableRestStyle()
                        .formatFileName("%sController")
                        .build()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}